Hi Zbigniew,
This is a great brief explanation. Perhaps a one or two line comment to this effect would be useful for others trying to figure it out later? Warner > On Jul 21, 2015, at 10:02 AM, Zbigniew Bodek <[email protected]> wrote: > > Hello Andrew, > > Please check in-line. > > Best regards > zbb > > 2015-07-21 17:01 GMT+02:00 Andrew Turner <[email protected]>: >> On Tue, 21 Jul 2015 14:47:24 +0000 (UTC) >> Zbigniew Bodek <[email protected]> wrote: >> >>> Author: zbb >>> Date: Tue Jul 21 14:47:23 2015 >>> New Revision: 285752 >>> URL: https://svnweb.freebsd.org/changeset/base/285752 >>> >>> Log: >>> Add support for vendor specific function for PCI devid acquisition >>> in ITS >>> It is possible that some HW will use different PCI devids, >>> hence allow to replace the default domain:bus:slot:func schema >>> by implementing and registering custom function. >>> >>> Obtained from: Semihalf >>> Sponsored by: The FreeBSD Foundation >>> Differential Revision: https://reviews.freebsd.org/D3118 >>> >>> Modified: >>> head/sys/arm64/arm64/gic_v3_its.c >>> head/sys/arm64/arm64/gic_v3_var.h >>> head/sys/dev/pci/pcireg.h >>> >>> Modified: head/sys/arm64/arm64/gic_v3_its.c >>> ============================================================================== >>> --- head/sys/arm64/arm64/gic_v3_its.c Tue Jul 21 14:39:34 >>> 2015 (r285751) +++ head/sys/arm64/arm64/gic_v3_its.c >>> Tue Jul 21 14:47:23 2015 (r285752) @@ -44,6 +44,7 @@ >>> __FBSDID("$FreeBSD$"); #include <sys/lock.h> >>> #include <sys/mutex.h> >>> >>> +#include <dev/pci/pcireg.h> >>> #include <dev/pci/pcivar.h> >>> >>> #include <vm/vm.h> >>> @@ -89,6 +90,7 @@ static void its_free_tables(struct gic_v >>> static void its_init_commandq(struct gic_v3_its_softc *); >>> static int its_init_cpu(struct gic_v3_its_softc *); >>> static void its_init_cpu_collection(struct gic_v3_its_softc *); >>> +static uint32_t its_get_devid(device_t); >>> >>> static int its_cmd_send(struct gic_v3_its_softc *, struct >>> its_cmd_desc *); >>> @@ -133,6 +135,23 @@ const char *its_ptab_type[] = { >>> [GITS_BASER_TYPE_RES7] = "Reserved (7)", >>> }; >>> >>> +/* >>> + * Vendor specific quirks. >>> + * One needs to add appropriate entry to its_quirks[] >>> + * table if the imlementation varies from the generic ARM ITS. >>> + */ >>> + >>> +/* Cavium ThunderX PCI devid acquire function */ >>> +static uint32_t its_get_devid_thunder(device_t); >>> + >>> +static const struct its_quirks its_quirks[] = { >>> + { >>> + .cpuid = CPU_ID_RAW(CPU_IMPL_CAVIUM, >>> CPU_PART_THUNDER, 0, 0), >>> + .cpuid_mask = CPU_IMPL_MASK | CPU_PART_MASK, >>> + .devid_func = its_get_devid_thunder, >>> + }, >>> +}; >>> + >>> static struct gic_v3_its_softc *its_sc; >>> >>> #define gic_its_read(sc, len, reg) \ >>> @@ -1300,7 +1319,7 @@ its_device_alloc_locked(struct gic_v3_it >>> if (newdev != NULL) >>> return (newdev); >>> >>> - devid = PCI_DEVID(pci_dev); >>> + devid = its_get_devid(pci_dev); >>> >>> /* There was no previously created device. Create one now */ >>> newdev = malloc(sizeof(*newdev), M_GIC_V3_ITS, (M_WAITOK | >>> M_ZERO)); @@ -1353,6 +1372,73 @@ its_device_asign_lpi_locked(struct >>> gic_v its_dev->lpis.lpi_free); >>> its_dev->lpis.lpi_free--; >>> } >>> + >>> +/* >>> + * ITS quirks. >>> + * Add vendor specific PCI devid function here. >>> + */ >>> +static uint32_t >>> +its_get_devid_thunder(device_t pci_dev) >>> +{ >>> + int bsf; >>> + int pem; >>> + uint32_t bus; >>> + >>> + bus = pci_get_bus(pci_dev); >>> + >>> + bsf = PCI_RID(pci_get_bus(pci_dev), pci_get_slot(pci_dev), >>> + pci_get_function(pci_dev)); >>> + >>> + /* ECAM is on bus=0 */ >>> + if (bus == 0) { >>> + return ((pci_get_domain(pci_dev) << >>> PCI_RID_DOMAIN_SHIFT) | >>> + bsf); >>> + /* PEM otherwise */ >>> + } else { >>> + /* PEM number is equal to domain */ >>> + pem = pci_get_domain(pci_dev); >> >> But what is a PEM number? > > PEM == PCI-E MAC. > This is the number of root complex. > >> >>> + >>> + /* Hardcode appropriate PEM numbers */ >>> + if (pem < 3 ) >>> + return ((0x1 << PCI_RID_DOMAIN_SHIFT) | bsf); >>> + >>> + if (pem < 6 ) >>> + return ((0x3 << PCI_RID_DOMAIN_SHIFT) | bsf); >>> + >>> + if (pem < 9 ) >>> + return ((0x9 << PCI_RID_DOMAIN_SHIFT) | bsf); >>> + >>> + if (pem < 12 ) >>> + return ((0xB << PCI_RID_DOMAIN_SHIFT) | bsf); >> >> What do these magic numbers mean? > > This is a domain portion of PCI device ID passed by the HW along with > the transaction to memory. > In that case the methodology differs from the genuine (default in this > driver) ARM implementation and it is Thunder-specific. > >> >>> + } >>> + >>> + return (0); >>> +} >>> + >> >> Andrew >> _______________________________________________ >> [email protected] mailing list >> http://lists.freebsd.org/mailman/listinfo/svn-src-all >> To unsubscribe, send any mail to "[email protected]"
signature.asc
Description: Message signed with OpenPGP using GPGMail
