Lines Matching +full:hba +full:- +full:cap

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (c) 2006, Kyle McMartin <kyle@parisc-linux.org>
7 * Based on drivers/char/agpgart/hp-agp.c which is
8 * (c) Copyright 2002, 2003 Hewlett-Packard Development Company, L.P.
20 #include <asm/parisc-device.h>
71 agp_bridge->current_size = (void *) &parisc_agp_sizes[0]; in parisc_agp_fetch_size()
81 agp_bridge->gart_bus_addr = info->gart_base; in parisc_agp_configure()
82 agp_bridge->capndx = info->lba_cap_offset; in parisc_agp_configure()
83 agp_bridge->mode = readl(info->lba_regs+info->lba_cap_offset+PCI_AGP_STATUS); in parisc_agp_configure()
96 writeq(info->gart_base | ilog2(info->gart_size), info->ioc_regs+IOC_PCOM); in parisc_agp_tlbflush()
97 readq(info->ioc_regs+IOC_PCOM); /* flush */ in parisc_agp_tlbflush()
106 for (i = 0; i < info->gatt_entries; i++) { in parisc_agp_create_gatt_table()
107 info->gatt[i] = cpu_to_le64(agp_bridge->scratch_page); in parisc_agp_create_gatt_table()
118 info->gatt[0] = SBA_AGPGART_COOKIE; in parisc_agp_free_gatt_table()
131 if (type != mem->type || in parisc_agp_insert_memory()
132 agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type)) { in parisc_agp_insert_memory()
133 return -EINVAL; in parisc_agp_insert_memory()
136 io_pg_start = info->io_pages_per_kpage * pg_start; in parisc_agp_insert_memory()
137 io_pg_count = info->io_pages_per_kpage * mem->page_count; in parisc_agp_insert_memory()
138 if ((io_pg_start + io_pg_count) > info->gatt_entries) { in parisc_agp_insert_memory()
139 return -EINVAL; in parisc_agp_insert_memory()
144 if (info->gatt[j]) in parisc_agp_insert_memory()
145 return -EBUSY; in parisc_agp_insert_memory()
149 if (!mem->is_flushed) { in parisc_agp_insert_memory()
151 mem->is_flushed = true; in parisc_agp_insert_memory()
154 for (i = 0, j = io_pg_start; i < mem->page_count; i++) { in parisc_agp_insert_memory()
157 paddr = page_to_phys(mem->pages[i]); in parisc_agp_insert_memory()
159 k < info->io_pages_per_kpage; in parisc_agp_insert_memory()
160 k++, j++, paddr += info->io_page_size) { in parisc_agp_insert_memory()
161 info->gatt[j] = cpu_to_le64( in parisc_agp_insert_memory()
164 asm_io_fdc(&info->gatt[j]); in parisc_agp_insert_memory()
168 agp_bridge->driver->tlb_flush(mem); in parisc_agp_insert_memory()
179 if (type != mem->type || in parisc_agp_remove_memory()
180 agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type)) { in parisc_agp_remove_memory()
181 return -EINVAL; in parisc_agp_remove_memory()
184 io_pg_start = info->io_pages_per_kpage * pg_start; in parisc_agp_remove_memory()
185 io_pg_count = info->io_pages_per_kpage * mem->page_count; in parisc_agp_remove_memory()
187 info->gatt[i] = cpu_to_le64(agp_bridge->scratch_page); in parisc_agp_remove_memory()
190 agp_bridge->driver->tlb_flush(mem); in parisc_agp_remove_memory()
207 /* return native (big-endian) PDIR entry */ in parisc_agp_mask_memory()
217 command = readl(info->lba_regs + info->lba_cap_offset + PCI_AGP_STATUS); in parisc_agp_enable()
222 writel(command, info->lba_regs + info->lba_cap_offset + PCI_AGP_COMMAND); in parisc_agp_enable()
261 info->ioc_regs = ioc_regs; in agp_ioc_init()
263 io_tlb_ps = readq(info->ioc_regs+IOC_TCNFG); in agp_ioc_init()
272 info->gatt = NULL; in agp_ioc_init()
273 info->gatt_entries = 0; in agp_ioc_init()
274 return -ENODEV; in agp_ioc_init()
276 info->io_page_size = 1 << io_tlb_shift; in agp_ioc_init()
277 info->io_pages_per_kpage = PAGE_SIZE / info->io_page_size; in agp_ioc_init()
279 iova_base = readq(info->ioc_regs+IOC_IBASE) & ~0x1; in agp_ioc_init()
280 info->gart_base = iova_base + PLUTO_IOVA_SIZE - PLUTO_GART_SIZE; in agp_ioc_init()
282 info->gart_size = PLUTO_GART_SIZE; in agp_ioc_init()
283 info->gatt_entries = info->gart_size / info->io_page_size; in agp_ioc_init()
285 io_pdir = phys_to_virt(readq(info->ioc_regs+IOC_PDIR_BASE)); in agp_ioc_init()
286 info->gatt = &io_pdir[(PLUTO_IOVA_SIZE/2) >> PAGE_SHIFT]; in agp_ioc_init()
288 if (info->gatt[0] != SBA_AGPGART_COOKIE) { in agp_ioc_init()
289 info->gatt = NULL; in agp_ioc_init()
290 info->gatt_entries = 0; in agp_ioc_init()
293 return -ENODEV; in agp_ioc_init()
300 lba_find_capability(int cap) in lba_find_capability() argument
307 status = readw(info->lba_regs + PCI_STATUS); in lba_find_capability()
310 pos = readb(info->lba_regs + PCI_CAPABILITY_LIST); in lba_find_capability()
311 while (ttl-- && pos >= 0x40) { in lba_find_capability()
313 id = readb(info->lba_regs + pos + PCI_CAP_LIST_ID); in lba_find_capability()
316 if (id == cap) in lba_find_capability()
318 pos = readb(info->lba_regs + pos + PCI_CAP_LIST_NEXT); in lba_find_capability()
327 int cap; in agp_lba_init() local
329 info->lba_regs = lba_hpa; in agp_lba_init()
330 info->lba_cap_offset = lba_find_capability(PCI_CAP_ID_AGP); in agp_lba_init()
332 cap = readl(lba_hpa + info->lba_cap_offset) & 0xff; in agp_lba_init()
333 if (cap != PCI_CAP_ID_AGP) { in agp_lba_init()
335 cap, info->lba_cap_offset); in agp_lba_init()
336 return -ENODEV; in agp_lba_init()
351 error = -ENOMEM; in parisc_agp_setup()
365 error = -ENOMEM; in parisc_agp_setup()
368 bridge->driver = &parisc_agp_driver; in parisc_agp_setup()
370 fake_bridge_dev->vendor = PCI_VENDOR_ID_HP; in parisc_agp_setup()
371 fake_bridge_dev->device = PCI_DEVICE_ID_HP_PCIX_LBA; in parisc_agp_setup()
372 bridge->dev = fake_bridge_dev; in parisc_agp_setup()
399 int err = -1; in parisc_agp_init()
407 sba = sba_list->dev; in parisc_agp_init()
414 device_for_each_child(&sba->dev, &lba, find_quicksilver); in parisc_agp_init()
424 parisc_agp_setup(sba_list->ioc[0].ioc_hpa, lbadev->hba.base_addr); in parisc_agp_init()
434 MODULE_AUTHOR("Kyle McMartin <kyle@parisc-linux.org>");