All of lore.kernel.org
 help / color / mirror / Atom feed
* [Linux-ia64] [PATCH] ACPI merge cleanup
@ 2002-04-19 18:44 Bjorn Helgaas
  0 siblings, 0 replies; only message in thread
From: Bjorn Helgaas @ 2002-04-19 18:44 UTC (permalink / raw)
  To: linux-ia64

This patch against 2.4.18+ia64-020410 puts back a few things that
got lost in the big ACPI merge and makes the generic kernel work again.

  - Adjust to pci_root_ops declaration change
  - Add back acpi_get_sysname() body
  - Add back acpi_get_crs() and friends
  - Declare acpi_get_sysname()
  - Define page_to_phys() for generic kernel
  - ACPI: Fix _CID match
  - ACPI: virt_to_phys(efi.acpi20) (previously treated as already phys)
  - ACPI: Use ioremap rather phys_to_virt() for uncacheable space

David, I think you already have the _CID fix.  I'll send the ACPI
stuff to the ACPI folks as well.

This does not fix the problem of the ACPI interpreter barfing on
the HP zx1 _CRS methods.
-- 
Bjorn Helgaas - bjorn_helgaas@hp.com
Linux Systems Operation R&D
Hewlett-Packard



diff -u -r -X exclude linux-2.4.18-ia64-020410/arch/ia64/hp/zx1/hpzx1_misc.c linux-2.4.18-ia64-020410-test/arch/ia64/hp/zx1/hpzx1_misc.c
--- linux-2.4.18-ia64-020410/arch/ia64/hp/zx1/hpzx1_misc.c	Wed Apr 10 17:01:16 2002
+++ linux-2.4.18-ia64-020410-test/arch/ia64/hp/zx1/hpzx1_misc.c	Thu Apr 18 11:40:34 2002
@@ -42,7 +42,7 @@
 
 static struct fake_pci_dev *fake_pci_head, **fake_pci_tail = &fake_pci_head;
 
-static struct pci_ops orig_pci_ops;
+static struct pci_ops *orig_pci_ops;
 
 static inline struct fake_pci_dev *
 fake_pci_find_slot(unsigned char bus, unsigned int devfn)
@@ -77,7 +77,7 @@
 { \
 	struct fake_pci_dev *fake_dev; \
 	if (!(fake_dev = fake_pci_find_slot(dev->bus->number, dev->devfn))) \
-		return orig_pci_ops.name(dev, where, value); \
+		return orig_pci_ops->name(dev, where, value); \
 	\
 	switch (where) { \
 	case PCI_COMMAND: \
@@ -105,7 +105,7 @@
 { \
 	struct fake_pci_dev *fake_dev; \
 	if (!(fake_dev = fake_pci_find_slot(dev->bus->number, dev->devfn))) \
-		return orig_pci_ops.name(dev, where, value); \
+		return orig_pci_ops->name(dev, where, value); \
 	\
 	switch (where) { \
 	case PCI_BASE_ADDRESS_0: \
@@ -261,7 +261,6 @@
 
 	status = hp_csr_space(obj, &csr_base, &csr_length);
 
-printk("hpzx1_sba_probe: status=%d\n", status);
 	if (status != AE_OK)
 		return status;
 
@@ -296,7 +295,7 @@
 	if (status != AE_OK)
 		return status;
 
-	status = acpi_cf_evaluate_method(obj, METHOD_NAME__BBN, &busnum);
+	status = acpi_evaluate_integer(obj, METHOD_NAME__BBN, NULL, &busnum);
 	if (ACPI_FAILURE(status)) {
 		printk(KERN_ERR PFX "evaluate _BBN fail=0x%x\n", status);
 		busnum = 0;	// no _BBN; stick it on bus 0
@@ -314,7 +313,7 @@
 static void
 hpzx1_acpi_dev_init(void)
 {
-	extern struct pci_ops pci_conf;
+	extern struct pci_ops *pci_root_ops;
 
 	/*
 	 * Make fake PCI devices for the following hardware in the
@@ -328,7 +327,6 @@
 	 * HWP0002: LBA device
 	 * HWP0003: AGP LBA device
 	 */
-printk("hpzx1_acpi_dev_init\n");
 	acpi_get_devices("HWP0001", hpzx1_sba_probe, "HWP0001", NULL);
 #ifdef CONFIG_IA64_HP_PROTO
 	if (fake_pci_tail != &fake_pci_head) {
@@ -385,8 +383,8 @@
 	/*
 	 * Replace PCI ops, but only if we made fake devices.
 	 */
-	orig_pci_ops = pci_conf;
-	pci_conf = hp_pci_conf;
+	orig_pci_ops = pci_root_ops;
+	pci_root_ops = &hp_pci_conf;
 }
 
 extern void sba_init(void);
diff -u -r -X exclude linux-2.4.18-ia64-020410/arch/ia64/kernel/acpi.c linux-2.4.18-ia64-020410-test/arch/ia64/kernel/acpi.c
--- linux-2.4.18-ia64-020410/arch/ia64/kernel/acpi.c	Wed Apr 10 17:01:16 2002
+++ linux-2.4.18-ia64-020410-test/arch/ia64/kernel/acpi.c	Fri Apr 19 11:30:43 2002
@@ -64,10 +64,39 @@
 acpi_get_sysname (void)
 {
 #ifdef CONFIG_IA64_GENERIC
-	return "hpsim";
+	unsigned long rsdp_phys = 0;
+	struct acpi20_table_rsdp *rsdp;
+	struct acpi_table_xsdt *xsdt;
+	struct acpi_table_header *hdr;
+
+	if ((0 != acpi_find_rsdp(&rsdp_phys)) || !rsdp_phys) {
+		printk("ACPI 2.0 RSDP not found, default to \"dig\"\n");
+		return "dig";
+	}
+
+	rsdp = (struct acpi20_table_rsdp *) __va(rsdp_phys);
+	if (strncmp(rsdp->signature, RSDP_SIG, sizeof(RSDP_SIG) - 1)) {
+		printk("ACPI 2.0 RSDP signature incorrect, default to \"dig\"\n");
+		return "dig";
+	}
+
+	xsdt = (struct acpi_table_xsdt *) __va(rsdp->xsdt_address);
+	hdr = &xsdt->header;
+	if (strncmp(hdr->signature, XSDT_SIG, sizeof(XSDT_SIG) - 1)) {
+		printk("ACPI 2.0 XSDT signature incorrect, default to \"dig\"\n");
+		return "dig";
+	}
+
+	if (!strcmp(hdr->oem_id, "HP")) {
+		return "hpzx1";
+	}
+
+	return "dig";
 #else
 # if defined (CONFIG_IA64_HP_SIM)
 	return "hpsim";
+# elif defined (CONFIG_IA64_HP_ZX1)
+	return "hpzx1";
 # elif defined (CONFIG_IA64_SGI_SN1)
 	return "sn1";
 # elif defined (CONFIG_IA64_SGI_SN2)
@@ -592,3 +621,61 @@
 
         return 0;
 }
+
+#ifdef CONFIG_ACPI
+
+/**
+ * acpi_get_crs - Return the current resource settings for a device
+ * obj: A handle for this device
+ * buf: A buffer to be populated by this call.
+ *
+ * Pass a valid handle, typically obtained by walking the namespace and a
+ * pointer to an allocated buffer, and this function will fill in the buffer
+ * with a list of acpi_resource structures.
+ */
+acpi_status acpi_get_crs(acpi_handle obj, acpi_buffer *buf)
+{
+	acpi_status result;
+	buf->length = 0;
+	buf->pointer = NULL;
+
+	result = acpi_get_current_resources(obj, buf);
+	if (result != AE_BUFFER_OVERFLOW)
+		return result;
+	buf->pointer = kmalloc(buf->length, GFP_KERNEL);
+	if (!buf->pointer)
+		return -ENOMEM;
+
+	result = acpi_get_current_resources(obj, buf);
+
+	return result;
+}
+
+acpi_resource *acpi_get_crs_next(acpi_buffer *buf, int *offset)
+{
+	acpi_resource *res;
+
+	if (*offset >= buf->length)
+		return NULL;
+
+	res = buf->pointer + *offset;
+	*offset += res->length;
+	return res;
+}
+
+acpi_resource_data *acpi_get_crs_type(acpi_buffer *buf, int *offset, int type)
+{
+	for (;;) {
+		acpi_resource *res = acpi_get_crs_next(buf, offset);
+		if (!res)
+			return NULL;
+		if (res->id = type)
+			return &res->data;
+	}
+}
+
+void acpi_dispose_crs(acpi_buffer *buf)
+{
+	kfree(buf->pointer);
+}
+#endif /* CONFIG_ACPI */
diff -u -r -X exclude linux-2.4.18-ia64-020410/drivers/acpi/acpi_bus.c linux-2.4.18-ia64-020410-test/drivers/acpi/acpi_bus.c
--- linux-2.4.18-ia64-020410/drivers/acpi/acpi_bus.c	Wed Apr 10 17:01:16 2002
+++ linux-2.4.18-ia64-020410-test/drivers/acpi/acpi_bus.c	Thu Apr 18 13:04:31 2002
@@ -1053,7 +1053,7 @@
 		if (!cid[0])
 			return -ENOENT;
 
-		if (0 != strstr(cid, device->pnp.hardware_id))
+		if (0 != strstr(driver->ids, cid))
 			return 0;
 	}
 
diff -u -r -X exclude linux-2.4.18-ia64-020410/drivers/acpi/acpi_osl.c linux-2.4.18-ia64-020410-test/drivers/acpi/acpi_osl.c
--- linux-2.4.18-ia64-020410/drivers/acpi/acpi_osl.c	Wed Apr 10 17:01:16 2002
+++ linux-2.4.18-ia64-020410-test/drivers/acpi/acpi_osl.c	Fri Apr 19 12:24:41 2002
@@ -158,9 +158,9 @@
 #else /*CONFIG_ACPI_EFI*/
 	addr->pointer_type = ACPI_PHYSICAL_POINTER;
 	if (efi.acpi20)
-		addr->pointer.physical = (ACPI_PHYSICAL_ADDRESS) efi.acpi20;
+		addr->pointer.physical = (ACPI_PHYSICAL_ADDRESS) virt_to_phys(efi.acpi20);
 	else if (efi.acpi)
-		addr->pointer.physical = (ACPI_PHYSICAL_ADDRESS) efi.acpi;
+		addr->pointer.physical = (ACPI_PHYSICAL_ADDRESS) virt_to_phys(efi.acpi);
 	else {
 		printk(KERN_ERR PREFIX "System description tables not found\n");
 		addr->pointer.physical = 0;
@@ -174,6 +174,13 @@
 acpi_status
 acpi_os_map_memory(ACPI_PHYSICAL_ADDRESS phys, ACPI_SIZE size, void **virt)
 {
+#ifdef CONFIG_ACPI_EFI
+	if (EFI_MEMORY_UC & efi_mem_attributes(phys)) {
+		*virt = ioremap(phys, size);
+	} else {
+		*virt = phys_to_virt(phys);
+	}
+#else
 	if (phys > ULONG_MAX) {
 		printk(KERN_ERR PREFIX "Cannot map memory that high\n");
 		return AE_BAD_PARAMETER;
@@ -183,6 +190,7 @@
 	 * ioremap already checks to ensure this is in reserved space
 	 */
 	*virt = ioremap((unsigned long) phys, size);
+#endif
 	if (!*virt)
 		return AE_NO_MEMORY;
 
@@ -324,26 +332,41 @@
 	void			*value,
 	u32			width)
 {
-	u32 dummy;
-
+	u32			dummy;
+	int			iomem = 0;
+	void			*virt_addr;
+
+#ifdef CONFIG_ACPI_EFI
+	if (EFI_MEMORY_UC & efi_mem_attributes(phys_addr)) {
+		iomem = 1;
+		virt_addr = ioremap(phys_addr, width);
+	} else {
+		virt_addr = phys_to_virt(phys_addr);
+	}
+#else
+	virt_addr = phys_to_virt(phys_addr);
+#endif
 	if (!value)
 		value = &dummy;
 
 	switch (width)
 	{
 	case 8:
-		*(u8*) value = *(u8*) phys_to_virt(phys_addr);
+		*(u8*) value = *(u8*) virt_addr;
 		break;
 	case 16:
-		*(u16*) value = *(u16*) phys_to_virt(phys_addr);
+		*(u16*) value = *(u16*) virt_addr;
 		break;
 	case 32:
-		*(u32*) value = *(u32*) phys_to_virt(phys_addr);
+		*(u32*) value = *(u32*) virt_addr;
 		break;
 	default:
 		BUG();
 	}
 
+	if (iomem)
+		iounmap(virt_addr);
+
 	return AE_OK;
 }
 
@@ -353,20 +376,37 @@
 	acpi_integer		value,
 	u32			width)
 {
+	int			iomem = 0;
+	void			*virt_addr;
+
+#ifdef CONFIG_ACPI_EFI
+	if (EFI_MEMORY_UC & efi_mem_attributes(phys_addr)) {
+		iomem = 1;
+		virt_addr = ioremap(phys_addr,width);
+	} else {
+		virt_addr = phys_to_virt(phys_addr);
+	}
+#else
+	virt_addr = phys_to_virt(phys_addr);
+#endif
+
 	switch (width)
 	{
 	case 8:
-		*(u8*) phys_to_virt(phys_addr) = value;
+		*(u8*) virt_addr = value;
 		break;
 	case 16:
-		*(u16*) phys_to_virt(phys_addr) = value;
+		*(u16*) virt_addr = value;
 		break;
 	case 32:
-		*(u32*) phys_to_virt(phys_addr) = value;
+		*(u32*) virt_addr = value;
 		break;
 	default:
 		BUG();
 	}
+
+	if (iomem)
+		iounmap(virt_addr);
 
 	return AE_OK;
 }
diff -u -r -X exclude linux-2.4.18-ia64-020410/include/asm-ia64/acpi.h linux-2.4.18-ia64-020410-test/include/asm-ia64/acpi.h
--- linux-2.4.18-ia64-020410/include/asm-ia64/acpi.h	Wed Apr 10 17:01:19 2002
+++ linux-2.4.18-ia64-020410-test/include/asm-ia64/acpi.h	Thu Apr 18 11:40:34 2002
@@ -32,6 +32,7 @@
 
 #define __acpi_map_table(phys_addr, size) __va(phys_addr)
 
+const char *acpi_get_sysname (void);
 int acpi_boot_init (char *cdline);
 int acpi_find_rsdp (unsigned long *phys_addr);
 int acpi_request_vector (u32 int_type);
diff -u -r -X exclude linux-2.4.18-ia64-020410/include/asm-ia64/page.h linux-2.4.18-ia64-020410-test/include/asm-ia64/page.h
--- linux-2.4.18-ia64-020410/include/asm-ia64/page.h	Thu Apr 11 14:03:53 2002
+++ linux-2.4.18-ia64-020410-test/include/asm-ia64/page.h	Thu Apr 18 11:43:15 2002
@@ -55,7 +55,7 @@
 #ifdef CONFIG_IA64_GENERIC
 # include <asm/machvec.h>
 # define virt_to_page(kaddr)	(mem_map + platform_map_nr(kaddr))
-# define page_to_phys(page)	XXX fix me
+# define page_to_phys(page)	((page - mem_map) << PAGE_SHIFT)
 #elif defined (CONFIG_IA64_SGI_SN1)
 # ifndef CONFIG_DISCONTIGMEM
 #  define virt_to_page(kaddr)	(mem_map + MAP_NR_DENSE(kaddr))


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-04-19 18:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-04-19 18:44 [Linux-ia64] [PATCH] ACPI merge cleanup Bjorn Helgaas

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.