Lines Matching refs:dma_domain

57 static phys_addr_t get_phys_addr(struct fsl_dma_domain *dma_domain, dma_addr_t iova)  in get_phys_addr()  argument
59 u32 win_cnt = dma_domain->win_cnt; in get_phys_addr()
60 struct dma_window *win_ptr = &dma_domain->win_arr[0]; in get_phys_addr()
63 geom = &dma_domain->iommu_domain.geometry; in get_phys_addr()
65 if (!win_cnt || !dma_domain->geom_size) { in get_phys_addr()
75 subwin_size = dma_domain->geom_size >> ilog2(win_cnt); in get_phys_addr()
78 win_ptr = &dma_domain->win_arr[wnd]; in get_phys_addr()
87 static int map_subwins(int liodn, struct fsl_dma_domain *dma_domain) in map_subwins() argument
89 struct dma_window *sub_win_ptr = &dma_domain->win_arr[0]; in map_subwins()
93 for (i = 0; i < dma_domain->win_cnt; i++) { in map_subwins()
97 ret = pamu_config_spaace(liodn, dma_domain->win_cnt, i, in map_subwins()
101 dma_domain->snoop_id, in map_subwins()
102 dma_domain->stash_id, in map_subwins()
117 static int map_win(int liodn, struct fsl_dma_domain *dma_domain) in map_win() argument
120 struct dma_window *wnd = &dma_domain->win_arr[0]; in map_win()
121 phys_addr_t wnd_addr = dma_domain->iommu_domain.geometry.aperture_start; in map_win()
129 dma_domain->snoop_id, dma_domain->stash_id, in map_win()
139 static int map_liodn(int liodn, struct fsl_dma_domain *dma_domain) in map_liodn() argument
141 if (dma_domain->win_cnt > 1) in map_liodn()
142 return map_subwins(liodn, dma_domain); in map_liodn()
144 return map_win(liodn, dma_domain); in map_liodn()
148 static int update_liodn(int liodn, struct fsl_dma_domain *dma_domain, u32 wnd_nr) in update_liodn() argument
151 struct dma_window *wnd = &dma_domain->win_arr[wnd_nr]; in update_liodn()
155 if (dma_domain->win_cnt > 1) { in update_liodn()
156 ret = pamu_config_spaace(liodn, dma_domain->win_cnt, wnd_nr, in update_liodn()
160 dma_domain->snoop_id, in update_liodn()
161 dma_domain->stash_id, in update_liodn()
170 wnd_addr = dma_domain->iommu_domain.geometry.aperture_start; in update_liodn()
176 dma_domain->snoop_id, dma_domain->stash_id, in update_liodn()
188 static int update_liodn_stash(int liodn, struct fsl_dma_domain *dma_domain, in update_liodn_stash() argument
195 if (!dma_domain->win_arr) { in update_liodn_stash()
202 for (i = 0; i < dma_domain->win_cnt; i++) { in update_liodn_stash()
219 struct fsl_dma_domain *dma_domain, in pamu_set_liodn() argument
237 window_size = dma_domain->geom_size; in pamu_set_liodn()
243 0, dma_domain->snoop_id, in pamu_set_liodn()
244 dma_domain->stash_id, win_cnt, 0); in pamu_set_liodn()
260 0, dma_domain->snoop_id, in pamu_set_liodn()
261 dma_domain->stash_id, in pamu_set_liodn()
331 static void detach_device(struct device *dev, struct fsl_dma_domain *dma_domain) in detach_device() argument
336 spin_lock_irqsave(&dma_domain->domain_lock, flags); in detach_device()
338 list_for_each_entry_safe(info, tmp, &dma_domain->devices, link) { in detach_device()
340 remove_device_ref(info, dma_domain->win_cnt); in detach_device()
342 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in detach_device()
345 static void attach_device(struct fsl_dma_domain *dma_domain, int liodn, struct device *dev) in attach_device() argument
356 if (old_domain_info && old_domain_info->domain != dma_domain) { in attach_device()
366 info->domain = dma_domain; in attach_device()
368 list_add(&info->link, &dma_domain->devices); in attach_device()
382 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_iova_to_phys() local
388 return get_phys_addr(dma_domain, iova); in fsl_pamu_iova_to_phys()
398 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_domain_free() local
401 detach_device(NULL, dma_domain); in fsl_pamu_domain_free()
403 dma_domain->enabled = 0; in fsl_pamu_domain_free()
404 dma_domain->mapped = 0; in fsl_pamu_domain_free()
406 kmem_cache_free(fsl_pamu_domain_cache, dma_domain); in fsl_pamu_domain_free()
411 struct fsl_dma_domain *dma_domain; in fsl_pamu_domain_alloc() local
416 dma_domain = iommu_alloc_dma_domain(); in fsl_pamu_domain_alloc()
417 if (!dma_domain) { in fsl_pamu_domain_alloc()
422 dma_domain->iommu_domain. geometry.aperture_start = 0; in fsl_pamu_domain_alloc()
423 dma_domain->iommu_domain.geometry.aperture_end = (1ULL << 36) - 1; in fsl_pamu_domain_alloc()
424 dma_domain->iommu_domain.geometry.force_aperture = true; in fsl_pamu_domain_alloc()
426 return &dma_domain->iommu_domain; in fsl_pamu_domain_alloc()
430 static int pamu_set_domain_geometry(struct fsl_dma_domain *dma_domain, in pamu_set_domain_geometry() argument
437 list_for_each_entry(info, &dma_domain->devices, link) { in pamu_set_domain_geometry()
438 ret = pamu_set_liodn(info->liodn, info->dev, dma_domain, in pamu_set_domain_geometry()
448 static int update_domain_stash(struct fsl_dma_domain *dma_domain, u32 val) in update_domain_stash() argument
453 list_for_each_entry(info, &dma_domain->devices, link) { in update_domain_stash()
454 ret = update_liodn_stash(info->liodn, dma_domain, val); in update_domain_stash()
463 static int update_domain_mapping(struct fsl_dma_domain *dma_domain, u32 wnd_nr) in update_domain_mapping() argument
468 list_for_each_entry(info, &dma_domain->devices, link) { in update_domain_mapping()
469 ret = update_liodn(info->liodn, dma_domain, wnd_nr); in update_domain_mapping()
476 static int disable_domain_win(struct fsl_dma_domain *dma_domain, u32 wnd_nr) in disable_domain_win() argument
481 list_for_each_entry(info, &dma_domain->devices, link) { in disable_domain_win()
482 if (dma_domain->win_cnt == 1 && dma_domain->enabled) { in disable_domain_win()
485 dma_domain->enabled = 0; in disable_domain_win()
496 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_window_disable() local
500 spin_lock_irqsave(&dma_domain->domain_lock, flags); in fsl_pamu_window_disable()
501 if (!dma_domain->win_arr) { in fsl_pamu_window_disable()
503 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_disable()
507 if (wnd_nr >= dma_domain->win_cnt) { in fsl_pamu_window_disable()
509 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_disable()
513 if (dma_domain->win_arr[wnd_nr].valid) { in fsl_pamu_window_disable()
514 ret = disable_domain_win(dma_domain, wnd_nr); in fsl_pamu_window_disable()
516 dma_domain->win_arr[wnd_nr].valid = 0; in fsl_pamu_window_disable()
517 dma_domain->mapped--; in fsl_pamu_window_disable()
521 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_disable()
527 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_window_enable() local
539 spin_lock_irqsave(&dma_domain->domain_lock, flags); in fsl_pamu_window_enable()
540 if (!dma_domain->win_arr) { in fsl_pamu_window_enable()
542 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_enable()
546 if (wnd_nr >= dma_domain->win_cnt) { in fsl_pamu_window_enable()
548 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_enable()
552 win_size = dma_domain->geom_size >> ilog2(dma_domain->win_cnt); in fsl_pamu_window_enable()
555 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_enable()
559 if (dma_domain->win_cnt == 1) { in fsl_pamu_window_enable()
560 if (dma_domain->enabled) { in fsl_pamu_window_enable()
562 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_enable()
569 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_enable()
574 wnd = &dma_domain->win_arr[wnd_nr]; in fsl_pamu_window_enable()
580 ret = update_domain_mapping(dma_domain, wnd_nr); in fsl_pamu_window_enable()
583 dma_domain->mapped++; in fsl_pamu_window_enable()
590 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_window_enable()
599 static int handle_attach_device(struct fsl_dma_domain *dma_domain, in handle_attach_device() argument
604 struct iommu_domain *domain = &dma_domain->iommu_domain; in handle_attach_device()
608 spin_lock_irqsave(&dma_domain->domain_lock, flags); in handle_attach_device()
618 attach_device(dma_domain, liodn[i], dev); in handle_attach_device()
624 if (dma_domain->win_arr) { in handle_attach_device()
625 u32 win_cnt = dma_domain->win_cnt > 1 ? dma_domain->win_cnt : 0; in handle_attach_device()
627 ret = pamu_set_liodn(liodn[i], dev, dma_domain, in handle_attach_device()
631 if (dma_domain->mapped) { in handle_attach_device()
636 ret = map_liodn(liodn[i], dma_domain); in handle_attach_device()
642 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in handle_attach_device()
650 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_attach_device() local
675 ret = handle_attach_device(dma_domain, dev, liodn, liodn_cnt); in fsl_pamu_attach_device()
687 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_detach_device() local
710 detach_device(dev, dma_domain); in fsl_pamu_detach_device()
718 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in configure_domain_geometry() local
733 spin_lock_irqsave(&dma_domain->domain_lock, flags); in configure_domain_geometry()
734 if (dma_domain->enabled) { in configure_domain_geometry()
736 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in configure_domain_geometry()
743 dma_domain->geom_size = geom_size; in configure_domain_geometry()
745 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in configure_domain_geometry()
751 static int configure_domain_stash(struct fsl_dma_domain *dma_domain, void *data) in configure_domain_stash() argument
757 spin_lock_irqsave(&dma_domain->domain_lock, flags); in configure_domain_stash()
759 memcpy(&dma_domain->dma_stash, stash_attr, in configure_domain_stash()
762 dma_domain->stash_id = get_stash_id(stash_attr->cache, in configure_domain_stash()
764 if (dma_domain->stash_id == ~(u32)0) { in configure_domain_stash()
766 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in configure_domain_stash()
770 ret = update_domain_stash(dma_domain, dma_domain->stash_id); in configure_domain_stash()
772 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in configure_domain_stash()
778 static int configure_domain_dma_state(struct fsl_dma_domain *dma_domain, bool enable) in configure_domain_dma_state() argument
784 spin_lock_irqsave(&dma_domain->domain_lock, flags); in configure_domain_dma_state()
786 if (enable && !dma_domain->mapped) { in configure_domain_dma_state()
788 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in configure_domain_dma_state()
792 dma_domain->enabled = enable; in configure_domain_dma_state()
793 list_for_each_entry(info, &dma_domain->devices, link) { in configure_domain_dma_state()
800 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in configure_domain_dma_state()
807 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_set_windows() local
811 spin_lock_irqsave(&dma_domain->domain_lock, flags); in fsl_pamu_set_windows()
813 if (dma_domain->enabled) { in fsl_pamu_set_windows()
815 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_set_windows()
820 if (!dma_domain->geom_size) { in fsl_pamu_set_windows()
822 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_set_windows()
832 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_set_windows()
836 ret = pamu_set_domain_geometry(dma_domain, &domain->geometry, in fsl_pamu_set_windows()
839 kfree(dma_domain->win_arr); in fsl_pamu_set_windows()
840 dma_domain->win_arr = kcalloc(w_count, in fsl_pamu_set_windows()
841 sizeof(*dma_domain->win_arr), in fsl_pamu_set_windows()
843 if (!dma_domain->win_arr) { in fsl_pamu_set_windows()
844 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_set_windows()
847 dma_domain->win_cnt = w_count; in fsl_pamu_set_windows()
849 spin_unlock_irqrestore(&dma_domain->domain_lock, flags); in fsl_pamu_set_windows()
857 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_set_domain_attr() local
865 ret = configure_domain_stash(dma_domain, data); in fsl_pamu_set_domain_attr()
868 ret = configure_domain_dma_state(dma_domain, *(int *)data); in fsl_pamu_set_domain_attr()
885 struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); in fsl_pamu_get_domain_attr() local
890 memcpy(data, &dma_domain->dma_stash, in fsl_pamu_get_domain_attr()
894 *(int *)data = dma_domain->enabled; in fsl_pamu_get_domain_attr()
900 *(u32 *)data = dma_domain->win_cnt; in fsl_pamu_get_domain_attr()