On 09/01/2011 05:10 PM, Christos Zoulas wrote:
Module Name: src Committed By: christos Date: Thu Sep 1 15:10:32 UTC 2011 Modified Files: src/sys/arch/i386/eisa: eisa_machdep.c src/sys/arch/i386/mca: mca_machdep.c src/sys/arch/x86/include: bus_private.h src/sys/arch/x86/isa: isa_machdep.c src/sys/arch/x86/pci: pci_machdep.c src/sys/arch/x86/x86: bus_dma.c src/sys/arch/xen/xen: isa_machdep.c xpci_xenbus.c src/sys/sys: bus.h Log Message: Add bus_dma overrides. From dyoung
Should NULL be allowed as first argument of bus_dma_tag_create? I would prefer for NULL to be allowed to make my life easier in the drmgem port from OpenBSD. But maybe requiring non-NULL would make more sense if this shall be used from MI device drivers only?
+int +bus_dma_tag_create(bus_dma_tag_t obdt, const uint64_t present, + const struct bus_dma_overrides *ov, void *ctx, bus_dma_tag_t *bdtp) { + uint64_t bit, bits, nbits; + bus_dma_tag_t bdt; + const void *fp; - (*tag->_dmatag_destroy)(tag); + if (ov == NULL || present == 0) + return EINVAL; + + bdt = kmem_alloc(sizeof(struct x86_bus_dma_tag), KM_SLEEP); + + if (bdt == NULL) + return ENOMEM; + + bdt->bdt_super = obdt; + + for (bits = present; bits != 0; bits = nbits) { + nbits = bits& (bits - 1); + bit = nbits ^ bits; + if ((fp = bit_to_function_pointer(ov, bit)) == NULL) { +#ifdef DEBUG + printf("%s: missing bit %" PRIx64 "\n", __func__, bit); +#endif + goto einval; + } + } + + bdt->bdt_ov = ov; + bdt->bdt_exists = obdt->bdt_exists | present;
Here obdt might be NULL. Note: bus_space_tag_create has the same issue. Grégoire