tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: pchb@acpi again
Hi!
From: KIYOHARA Takashi <kiyohara%kk.iij4u.or.jp@localhost>
Date: Sat, 13 Apr 2013 19:55:44 +0900 (JST)
> From: KIYOHARA Takashi <kiyohara%kk.iij4u.or.jp@localhost>
> Date: Tue, 09 Apr 2013 07:44:25 +0900 (JST)
>
> > From: Chuck Silvers <chuq%chuq.com@localhost>
> > Date: Mon, 8 Apr 2013 09:34:06 -0700
> >
> > > in acpi_pci.c, why do you need to skip the check for ACPI_VALID_ADR?
> > > does the ACPI info on ia64 not have that flag set when it should?
> >
> > In my memory, YES. :-<
> > But I can't access to my ia64 now. I will try and check at next weekend.
>
> In my ia64(zx6000), it looked that AcpiNsSearchAndEnter() returned
> AE_NOT_FOUND.
> How enable ACPI_DEBUG_PRINT or others many print?
I look this messages on my ia64. (e.g. PCI0)
_ADR Not found in 0xe00000003f9dd1e8 [Not adding]
Name [_ADR] not found in scope [PCI0] 0xe00000003f9dd1e8
I think that no this problem crops up by all ia64 machines. Do you know
the better evasion method?
# Can I fixup by acpi_md_callback()? I look and find that now.
Also my ia64 patch attach to this mail.
Thanks,
--
kiyohara
? ia64/bus_dma.c
Index: conf/GENERIC
===================================================================
RCS file: /cvsroot/src/sys/arch/ia64/conf/GENERIC,v
retrieving revision 1.5
diff -u -r1.5 GENERIC
--- conf/GENERIC 28 Apr 2012 23:03:40 -0000 1.5
+++ conf/GENERIC 14 Apr 2013 04:02:03 -0000
@@ -55,6 +55,7 @@
# These options enable verbose messages for several subsystems.
# Warning, these may compile large string tables into the kernel!
options ACPIVERBOSE # verbose ACPI device autoconfig messages
+options PCIVERBOSE # verbose PCI device autoconfig messages
# Kernel root file system and dump configuration.
@@ -75,8 +76,10 @@
# ACPI devices
acpitz* at acpi? # ACPI Thermal Zone
com* at acpi? # Serial communications interface
+pchb* at acpi?
-# PCI bus support
-#pci* at mainbus? bus ?
+# PCI Bus support
+pci* at pchb?
+
# Pull in optional local configuration
cinclude "arch/ia64/conf/GENERIC.local"
Index: conf/files.ia64
===================================================================
RCS file: /cvsroot/src/sys/arch/ia64/conf/files.ia64,v
retrieving revision 1.7
diff -u -r1.7 files.ia64
--- conf/files.ia64 1 Oct 2011 15:59:27 -0000 1.7
+++ conf/files.ia64 14 Apr 2013 04:02:03 -0000
@@ -86,6 +87,7 @@
# PCI fixup options # XXXXXX: Oops, required by acpi.c
defflag opt_pcifixup.h ACPI_PCI_FIXUP
+device pchb: pcibus
include "dev/acpi/files.acpi"
include "arch/ia64/conf/majors.ia64"
Index: ia64/autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/arch/ia64/ia64/autoconf.c,v
retrieving revision 1.6
diff -u -r1.6 autoconf.c
--- ia64/autoconf.c 29 Jul 2012 18:05:43 -0000 1.6
+++ ia64/autoconf.c 14 Apr 2013 04:02:03 -0000
@@ -36,6 +36,13 @@
#include <sys/device.h>
#include <sys/conf.h>
+#include <dev/pci/pcivar.h>
+
+#include <machine/pci_machdep.h>
+
+#include "pci.h"
+
+
void
cpu_rootconf(void)
{
@@ -58,3 +65,20 @@
spl0();
}
+
+void
+device_register(device_t dev, void *aux)
+{
+ device_t parent = device_parent(dev);
+
+#if NPCI > 0
+ if (parent != NULL &&
+ device_is_a(parent, "pci")) {
+ struct pci_attach_args *pa = aux;
+ pcitag_t tag = pci_make_tag(pa->pa_pc,
+ pa->pa_bus, pa->pa_device, pa->pa_function);
+
+ pci_device_register(tag, dev);
+ }
+#endif
+}
Index: ia64/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/ia64/ia64/mainbus.c,v
retrieving revision 1.9
diff -u -r1.9 mainbus.c
--- ia64/mainbus.c 17 May 2011 17:34:50 -0000 1.9
+++ ia64/mainbus.c 14 Apr 2013 04:02:03 -0000
@@ -118,6 +118,8 @@
aaa.aa_iot = IA64_BUS_SPACE_IO;
aaa.aa_memt = IA64_BUS_SPACE_MEM;
+ aaa.aa_dmat = 0;
+ aaa.aa_dmat64 = 0;
aaa.aa_pc = 0;
aaa.aa_pciflags =
PCI_FLAGS_IO_OKAY | PCI_FLAGS_MEM_OKAY |
Index: pci/pci_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/ia64/pci/pci_machdep.c,v
retrieving revision 1.3
diff -u -r1.3 pci_machdep.c
--- pci/pci_machdep.c 12 Jan 2013 08:40:51 -0000 1.3
+++ pci/pci_machdep.c 14 Apr 2013 04:02:04 -0000
@@ -1,6 +1,6 @@
/* $NetBSD: pci_machdep.c,v 1.3 2013/01/12 08:40:51 kiyohara Exp $ */
/*
- * Copyright (c) 2009, 2010 KIYOHARA Takashi
+ * Copyright (c) 2009, 2010, 2013 KIYOHARA Takashi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,6 +27,11 @@
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.3 2013/01/12 08:40:51 kiyohara
Exp $");
+#include <sys/errno.h>
+#include <sys/kmem.h>
+#include <sys/queue.h>
+#include <sys/systm.h>
+
#include <machine/bus.h>
#include <machine/sal.h>
@@ -34,6 +39,17 @@
#include <dev/pci/pcireg.h>
#include <dev/pci/pcidevs.h>
+#include <dev/acpi/acpivar.h>
+#include <dev/acpi/acpi_pci.h>
+#include <dev/acpi/pchb_acpivar.h>
+
+struct pcidev {
+ pcitag_t ptag;
+ device_t pdev;
+
+ SLIST_ENTRY(pcidev) pnext;
+};
+SLIST_HEAD(, pcidev) pcidevs = SLIST_HEAD_INITIALIZER(pcidevs);
void
pci_attach_hook(device_t parent, device_t self, struct pcibus_attach_args *pba)
@@ -96,3 +112,102 @@
if (res.sal_status < 0)
printf("pci configuration write failed\n");
}
+
+int
+pci_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *ih)
+{
+ device_t dev, bus, bridge;
+ pcitag_t tag;
+ struct pcidev *pcidev, *_pcidev;
+ struct acpi_devnode *ad;
+ struct acpi_resources res;
+ struct acpi_irq *irq;
+
+ dev = NULL;
+ ad = acpi_pcidev_find(0, pa->pa_bus, pa->pa_device, pa->pa_function);
+ if (ad != NULL && (dev = acpi_pcidev_find_dev(ad))) {
+ /* Find already maped resource in _CRS. */
+ ACPI_STATUS rv;
+
+ rv = acpi_resource_parse(dev, ad->ad_handle, "_CRS",
+ &res, &acpi_resource_parse_ops_default);
+ if (ACPI_SUCCESS(rv) && (irq = acpi_res_irq(&res, 0))) {
+ *ih = irq->ar_irq;
+ aprint_verbose_dev(dev, "irq found in _CRS\n");
+ return 0;
+ }
+ }
+
+ if (dev == NULL) { /* Find our device_t. */
+ tag = pci_make_tag(pa->pa_pc,
+ pa->pa_bus, pa->pa_device, pa->pa_function);
+ SLIST_FOREACH_SAFE(pcidev, &pcidevs, pnext, _pcidev)
+ if (pcidev->ptag == tag) {
+ dev = pcidev->pdev;
+ break;
+ }
+ }
+ if (dev != NULL) {
+ /* Find our Host-Bridge. */
+ int rv;
+
+ bus = device_parent(dev);
+ while (1) {
+ KASSERT(device_is_a(bus, "pci"));
+ bridge = device_parent(bus);
+ if (device_is_a(bridge, "pchb"))
+ break;
+ bus = device_parent(bridge); /* Is it pcib? */
+ }
+
+ /* Assign IRQ number in _PRT for our Host-Bridge. */
+ rv = pchb_acpi_assign_irq(bridge, pa);
+ if (rv != -1) {
+ *ih = rv;
+ aprint_verbose_dev(dev, "irq found in _PRT\n");
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+const char *
+pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih)
+{
+ static char irqstr[16];
+
+ sprintf(irqstr, "irq %d", ih);
+ return irqstr;
+}
+
+void *
+pci_intr_establish(pci_chipset_tag_t pc, pci_intr_handle_t ih, int level,
+ int (*handler)(void *), void *arg)
+{
+
+ return intr_establish(ih, IST_LEVEL, level, handler, arg);
+}
+
+void
+pci_intr_disestablish(pci_chipset_tag_t pc, void *ih)
+{
+
+ intr_disestablish(ih);
+}
+
+void
+pci_device_register(pcitag_t tag, device_t dev)
+{
+ struct pcidev *pcidev;
+
+ pcidev = kmem_alloc(sizeof(struct pcidev), KM_NOSLEEP);
+ if (pcidev == NULL) {
+ aprint_error_dev(dev, "pci device register failed\n");
+ return;
+ }
+
+ pcidev->ptag = tag;
+ pcidev->pdev = dev;
+ SLIST_INSERT_HEAD(&pcidevs, pcidev, pnext);
+}
Home |
Main Index |
Thread Index |
Old Index