Browse Source

ACPI: further get irq setup working.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Ronald G. Minnich 7 years ago
parent
commit
889479c45b
4 changed files with 157 additions and 26 deletions
  1. 1 0
      amd64/include/mach_acpi.h
  2. 9 2
      sys/src/cmd/acpi/irq.c
  3. 130 11
      sys/src/libacpi/harvey.c
  4. 17 13
      sys/src/libacpi/olsneracpi.c

+ 1 - 0
amd64/include/mach_acpi.h

@@ -48,3 +48,4 @@ typedef int ACPI_THREAD_ID;
 #define ACPI_MACHINE_WIDTH 64
 #pragma clang diagnostic ignored "-Wunused-variable"
 
+#define ACPI_GET_FUNCTION_NAME __func__

+ 9 - 2
sys/src/cmd/acpi/irq.c

@@ -58,7 +58,7 @@ main(int argc, char *argv[])
 	if (ACPI_FAILURE(status)) {
 		sysfatal("Error %d\n", status);
 	}
-        status = AcpiInitializeTables(NULL, 2048, FALSE);
+        status = AcpiInitializeTables(NULL, 0, FALSE);
         if (ACPI_FAILURE(status))
 		sysfatal("can't set up acpi tables: %d", status);
 
@@ -69,7 +69,7 @@ main(int argc, char *argv[])
 
 	/* from acpi: */
     	/* If the Hardware Reduced flag is set, machine is always in acpi mode */
-	AcpiGbl_ReducedHardware = 1;
+	//AcpiGbl_ReducedHardware = 1;
 	print("LOADED TABLES. Hi the any key to continue\n"); //getchar();
         status = AcpiEnableSubsystem(0);
         if (ACPI_FAILURE(status))
@@ -91,6 +91,13 @@ main(int argc, char *argv[])
 	if (ACPI_FAILURE(status)) {
 		sysfatal("Error %d\n", status);
 	}
+	ACPI_STATUS RouteIRQ(ACPI_PCI_ID* device, int pin, int* irq);
+	ACPI_PCI_ID id = {0, 0, 2, 0};
+	int irq;
+	for(int i = 0; i < 4; i++) {
+		status = RouteIRQ(&id, i, &irq);
+		print("status %d, irq %d\n", status, irq);
+	}
 	print("OK on init.\n");
 	exits(0);
 }

+ 130 - 11
sys/src/libacpi/harvey.c

@@ -64,6 +64,127 @@ static int tbdf(ACPI_PCI_ID *p)
 	return (p->Bus << 8) | (p->Device << 3) | (p->Function);
 }
 
+int iol = -1, iow = -1, iob = -1;
+
+uint32_t inl(uint16_t addr)
+{
+	uint64_t off = addr;
+	uint32_t l;
+	if (pread(iol, &l, 4, off) < 4)
+		print("inl(0x%x): %r\n", addr);
+	return l;
+}
+
+uint16_t ins(uint16_t addr)
+{
+	uint64_t off = addr;
+	uint16_t w;
+	if (pread(iow, &w, 2, off) < 2)
+		print("ins(0x%x): %r\n", addr);
+	return w;
+}
+
+uint8_t inb(uint16_t addr)
+{
+	uint64_t off = addr;
+	uint16_t b;
+	if (pread(iow, &b, 1, off) < 1)
+		print("inb(0x%x): %r\n", addr);
+	return b;
+}
+
+void outl(uint32_t val, uint16_t addr)
+{
+	uint64_t off = addr;
+	if (pwrite(iol, &val, 4, off) < 4)
+		print("outl(0x%x): %r\n", addr);
+}
+
+void outs(uint16_t val, uint16_t addr)
+{
+	uint64_t off = addr;
+	if (pwrite(iow, &val, 2, off) < 2)
+		print("outs(0x%x): %r\n", addr);
+}
+
+void outb(uint8_t val, uint16_t addr)
+{
+	uint64_t off = addr;
+	if (pwrite(iob, &val, 1, off) < 1)
+		print("outb(0x%x): %r\n", addr);
+}
+
+#define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
+#define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
+#define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
+#define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
+#define BUSTYPE(tbdf)	((tbdf)>>24)
+#define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
+
+enum
+{
+	PciADDR		= 0xCF8,	/* CONFIG_ADDRESS */
+	PciDATA		= 0xCFC,	/* CONFIG_DATA */
+
+	Maxfn			= 7,
+	Maxdev			= 31,
+	Maxbus			= 255,
+
+	/* command register */
+	IOen		= (1<<0),
+	MEMen		= (1<<1),
+	MASen		= (1<<2),
+	MemWrInv	= (1<<4),
+	PErrEn		= (1<<6),
+	SErrEn		= (1<<8),
+
+	Write,
+	Read,
+};
+
+static int
+pcicfgrw(int tbdf, int r, int data, int rw, int w)
+{
+	int o, x, er;
+
+	if(BUSDNO(tbdf) > Maxdev)
+		return -1;
+
+	o = r & (4-w);
+	er = (r&0xfc) | ((r & 0xf00)<<16);
+	outl(PciADDR, 0x80000000|BUSBDF(tbdf)|er);
+	if(rw == Read){
+		x = -1;
+		switch(w){
+		case 1:
+			x = inb(PciDATA+o);
+			break;
+		case 2:
+			x = ins(PciDATA+o);
+			break;
+		case 4:
+			x = inl(PciDATA+o);
+			break;
+		}
+	}else{
+		x = 0;
+		switch(w){
+		case 1:
+			outb(PciDATA+o, data);
+			break;
+		case 2:
+			outs(PciDATA+o, data);
+			break;
+		case 4:
+			outl(PciDATA+o, data);
+			break;
+		}
+	}
+//	outl(PciADDR, 0);
+
+	return x;
+}
+
 
 ACPI_STATUS
 AcpiOsReadPciConfiguration (
@@ -74,8 +195,6 @@ AcpiOsReadPciConfiguration (
 {
 	uint32_t dev = tbdf(PciId);
 	fprint(2,"%s 0x%lx\n", __func__, dev);
-	sysfatal("NOT");
-#if 0
 	switch(Width) {
 	case 32:
 		*Value = pcicfgr32(&p, Reg);
@@ -89,7 +208,6 @@ AcpiOsReadPciConfiguration (
 	default:
 		sysfatal("Can't read pci: bad width %d\n", Width);
 	}
-#endif
 	return AE_OK;
 
 }
@@ -103,8 +221,6 @@ AcpiOsWritePciConfiguration (
 {
 	uint32_t dev = tbdf(PciId);
 	fprint(2,"%s 0x%lx\n", __func__, dev);
-	sysfatal("NOT");
-#if 0
 	switch(Width) {
 	case 32:
 		pcicfgw32(&p, Reg, Value);
@@ -118,7 +234,6 @@ AcpiOsWritePciConfiguration (
 	default:
 		sysfatal("Can't read pci: bad width %d\n", Width);
 	}
-#endif
 	return AE_OK;
 }
 
@@ -431,8 +546,6 @@ AcpiOsReadPort (
     UINT32                  *Value,
     UINT32                  Width)
 {
-	/* Ooooooookay ... ACPI specifies the IO width in *bits*. */
-#if 0
 	switch(Width) {
 	case 4*8:
 		*Value = inl(Address);
@@ -447,7 +560,6 @@ AcpiOsReadPort (
 		sysfatal("%s, bad width %d", __func__, Width);
 		break;
 	}
-#endif
 	fprint(2,"%s 0x%x 0x%x\n", __func__, Address, *Value);
 	sysfatal("NOT");
 	return AE_OK;
@@ -459,7 +571,6 @@ AcpiOsWritePort (
     UINT32                  Value,
     UINT32                  Width)
 {
-#if 0
 	switch(Width) {
 	case 4*8:
 		outl(Address, Value);
@@ -474,7 +585,6 @@ AcpiOsWritePort (
 		sysfatal("%s, bad width %d", __func__, Width);
 		break;
 	}
-#endif
 	fprint(2,"%s 0x%x 0x%x\n", __func__, Address, Value);
 	sysfatal("NOT");
 	return AE_OK;
@@ -524,6 +634,15 @@ AcpiOsInitialize(void)
 	}
 	close(fd);
 
+	iol = open("/dev/iol", ORDWR);
+	if (iol < 0)
+		sysfatal("iol: %r");
+	iow = open("/dev/iow", ORDWR);
+	if (iow < 0)
+		sysfatal("iow: %r");
+	iob = open("/dev/iob", ORDWR);
+	if (iob < 0)
+		sysfatal("iob: %r");
 	return AE_OK;
 }
 /*

+ 17 - 13
sys/src/libacpi/olsneracpi.c

@@ -19,7 +19,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
-#include <acpi.h>
+#include "acpi.h"
+#include "accommon.h"
+#include "acapps.h"
+#include "actables.h"
+#include "acutils.h"
+#include <errno.h>
 
 #define _COMPONENT          ACPI_UTILITIES
 ACPI_MODULE_NAME    ("harvey")
@@ -151,7 +156,7 @@ static ACPI_STATUS ExecuteOSI(int pic_mode)
     ReturnValue.Length = ACPI_ALLOCATE_BUFFER;
 
     Status = AcpiEvaluateObject (NULL, "\\_PIC", &ArgList, &ReturnValue);
-	ACPI_FREE_BUFFER(ReturnValue);
+	////ACPI_FREE_BUFFER(ReturnValue);
 	if (Status == AE_NOT_FOUND)
 	{
 		printf("\\_PIC was not found. Assuming that's ok.\n");
@@ -224,7 +229,6 @@ failed:
 	return AE_OK;
 }
 
-#if 0
 static ACPI_STATUS PrintAPICTable(void) {
 	static const char *polarities[] = {
 		"Bus-Conformant",
@@ -308,6 +312,7 @@ ACPI_STATUS PrintAcpiDevice(ACPI_HANDLE Device)
 	return_ACPI_STATUS(status);
 }
 
+
 static ACPI_STATUS PrintDeviceCallback(ACPI_HANDLE Device, UINT32 Depth, void *Context, void** ReturnValue)
 {
 	return PrintAcpiDevice(Device);
@@ -343,7 +348,7 @@ typedef struct IRQRouteData
 } IRQRouteData;
 
 static void ResetBuffer(ACPI_BUFFER* buffer) {
-	ACPI_FREE_BUFFER((*buffer));
+	////ACPI_FREE_BUFFER((*buffer));
 	buffer->Pointer = 0;
 	buffer->Length = ACPI_ALLOCATE_BUFFER;
 }
@@ -392,7 +397,7 @@ static ACPI_STATUS RouteIRQLinkDevice(ACPI_HANDLE Device, ACPI_PCI_ROUTING_TABLE
 	CHECK_STATUS("AcpiSetCurrentResources");
 
 failed:
-	ACPI_FREE_BUFFER(buffer);
+	//ACPI_FREE_BUFFER(buffer);
 	return_ACPI_STATUS(status);
 }
 
@@ -435,15 +440,15 @@ static ACPI_STATUS RouteIRQCallback(ACPI_HANDLE Device, UINT32 Depth, void *Cont
 		if (status == AE_OK && addr64.ResourceType == ACPI_BUS_NUMBER_RANGE)
 		{
 			printf("RouteIRQ: Root bridge bus range %#x..%#x\n",
-					addr64.Minimum,
-					addr64.Maximum);
-			if (data->pci.Bus < addr64.Minimum ||
-				data->pci.Bus > addr64.Maximum)
+			       addr64.MinAddressFixed,
+					addr64.MaxAddressFixed);
+			if (data->pci.Bus < addr64.MinAddressFixed ||
+			    data->pci.Bus > addr64.MaxAddressFixed)
 			{
 				// This is not the root bridge we're looking for...
 				goto failed;
 			}
-			rootBus = addr64.Minimum;
+			rootBus = addr64.MinAddressFixed;
 			break;
 		}
 		resource = ACPI_NEXT_RESOURCE(resource);
@@ -500,12 +505,12 @@ static ACPI_STATUS RouteIRQCallback(ACPI_HANDLE Device, UINT32 Depth, void *Cont
 	status = AE_CTRL_TERMINATE;
 
 failed:
-	ACPI_FREE_BUFFER(buffer);
+	//ACPI_FREE_BUFFER(buffer);
 	ACPI_FREE(info);
 	return_ACPI_STATUS(status);
 }
 
-static ACPI_STATUS RouteIRQ(ACPI_PCI_ID* device, int pin, int* irq) {
+ACPI_STATUS RouteIRQ(ACPI_PCI_ID* device, int pin, int* irq) {
 	IRQRouteData data = { *device, pin, 0, 0, 0, FALSE };
 	ACPI_STATUS status = AE_OK;
 
@@ -525,7 +530,6 @@ static ACPI_STATUS RouteIRQ(ACPI_PCI_ID* device, int pin, int* irq) {
 	}
 	return_ACPI_STATUS(status);
 }
-#endif
 #if 0
 // reserve some virtual memory space (never touched) to keep track pci device
 // handles.